﻿#include "donxml.h"
#include<QFile>
#include<QDomDocument>//文件
#include<QDomProcessingInstruction>//格式头部
#include<QDomElement>//元素
#include<QDebug>
#include<QDomElement>
#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"
DonXml::DonXml()
{

}
//创建XML空文件
void DonXml::createXML()
{

    //创建QDomDocument对象

    QDomDocument xDoc;
    QDomProcessingInstruction instuction;

    //写入xml文件头（XML版本信息和编码信息）

    instuction=xDoc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    xDoc.appendChild(instuction);

    //创建根节点并将其添加xDox中
    QDomElement root=xDoc.createElement("root");
    xDoc.appendChild(root);

    //创建子节点
    QDomElement childNode1=xDoc.createElement("childNode1");
    //为子节点设置属性和值
    childNode1.setAttribute("attruKey","attriVal");
    //为子节点childNode1添加节点值
    //创建QDomText对象并设置值
    QDomText node1=xDoc.createTextNode("childNode1 val");

    //使用QDomElment对象的节点，添加节点值需添加QDomText对象，否则有可能不显示该值
    childNode1.appendChild(node1);

    //将子节点1添加岛根节点
    root.appendChild(childNode1);


    //创建子节点2
    QDomElement childNode2=xDoc.createElement("childNode2");
    childNode2.setAttribute("attruKey","attriVal");
    //创建多级节点的子节点1
    QDomElement cChildNode1=xDoc.createElement("cChildNode1");
    cChildNode1.setAttribute("shuxing1","1");
    QDomText node2=xDoc.createTextNode("cChildNode1 Val");
    cChildNode1.appendChild(node2);

    QDomElement cChildNode2=xDoc.createElement("cChildNode2");
    cChildNode2.setAttribute("shuxing2","2");
    QDomText node3=xDoc.createTextNode("cChildNode2 Val");
    cChildNode2.appendChild(node3);

    childNode2.appendChild(cChildNode1);
    childNode2.appendChild(cChildNode2);
    //将多级节点childNode2添加岛根节点

    root.appendChild(childNode2);

    //指定xml文件路径
    QFile file("./xmlTest.xml");
    //以只读方式打开，并且会清空文件内容
    if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
    {
        return ;
    }

    //使用文本流写入文件
    QTextStream outputStream(&file);

    xDoc.save(outputStream,4);//缩进4格

    file.close();





}

void DonXml::readXMl()
{
    QDomDocument xDoc;
    //指定读取的xml文件路径
    QFile file("./xmlTest.xml");
    //xml文件以只读的方式打开
    if(!file.open(QIODevice::ReadOnly))
    {
        return;
    }
    //调用setContent函数设置数据源
    if(!xDoc.setContent(&file))
    {
        file.close();
        return;

    }
    file.close();

    //获取xDoc中的QDomelmet根对象
    QDomElement docElem=xDoc.documentElement();

    //获取docElem的根节点
    QDomNode node=docElem.firstChild();

    //获取第一个子节点，并读取其属性及其值
    QDomElement childNode1=node.toElement();

    //获取childNode1的属性值
    QString attr1=childNode1.attribute("attruKey");
    //获取childNode1的节点值（既然设置节点值需要插入子节点，那么读取也应该取其节点值）
    QDomNode node1Child=childNode1.firstChild();
    QString node1Val=node1Child.nodeValue();

     //输出属性及节点值
    qDebug()<<"第一个子节点的属性值和节点值";
    qDebug()<<attr1<<node1Val;

    //将节点移至下一节点的位置
    node=node.nextSibling();

    //获取第二个节点，并使用循环获取其中的值
    QDomElement childNode2=node.toElement();
    qDebug()<<"第二节点的读取";
    //获取childNode的属性值
    QString attri2=childNode2.attribute("attruKey");
    qDebug()<<"第二节点的属性值"<<attri2;

    //获取第二节点中的第一节节点
    QDomNode cChildNode=childNode2.firstChild();
    while(!cChildNode.isNull())
    {
        //获取当前子节点的对象
        QDomElement e=cChildNode.toElement();
        if(!e.isNull())
        {
            qDebug()<<e.firstChild().nodeValue();
        }
        //获取下一节点元素
        cChildNode=cChildNode.nextSibling();
    }


}
